#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <stdlib.h>
#include <string.h>

//ширина таблицы
const int COLS = 4;

//возвращает длину массива строк завершающегося NULL'ом
int string_vectors_lenght(char *vect[]) {

    int lenght = 0;
    while(vect[lenght] != NULL) {
        lenght++;
    }

    return lenght;
}

//масштабирует картинку так, чтобы она могла уместиться в рамке max_height x max_width
GdkPixbuf *scale_pixbuf(GdkPixbuf *pixbuf, int max_height, int max_width) {

    int height = gdk_pixbuf_get_height(pixbuf);
    int width = gdk_pixbuf_get_width(pixbuf);
    
    if(height > width) {
        max_width = (int) (max_height * (width / (double) (height)));
    } else {
        max_height = (int) (max_width * (height / (double) (width)));
    }

    return gdk_pixbuf_scale_simple(pixbuf, max_width, max_height, GDK_INTERP_BILINEAR);
}

//возвращает таблицу способную вместить ncells ячеек
GtkWidget *new_table(int ncells) {

    int ncols = COLS;
    //если ncells не кратно COLS, округляем ncols в болльшую сторону
    int nrows = ncells / COLS + ((ncells % COLS != 0) ? 1 : 0);

    return gtk_table_new(nrows + 1, ncols + 1, TRUE);
}

//добавляет виджет widget, в таблицу table, в ячейку номер position
void add_widget_to_table(GtkWidget *table, GtkWidget *widget, int position) {
    
    int row = position / COLS;
    int col = position % COLS;

    gtk_table_attach_defaults(GTK_TABLE(table), widget, col, col + 1, row, row + 1);
}

//добавляет в таблицу table, виджеты widget, по одному в ячейку
//массив widgets должен заканчиваться NULL'ом
void add_widgets(GtkWidget *table, GtkWidget *widgets[]) {

    int i;
    for(i = 0; widgets[i] != NULL; i++) {
        add_widget_to_table(table, widgets[i], i);
        gtk_widget_show_all(widgets[i]);
    }
}

//возвращает массив картинок
//files_paths - адреса картинок в файловой системе
GtkWidget **new_images_preview_from_files(char *files_paths[],
        void (*callback)(GtkWidget *, GdkEvent *, gpointer)) {

    char *path;

    int i = 0;
    int nimgs = string_vectors_lenght(files_paths);
    GtkWidget **widgets = (GtkWidget **) malloc((nimgs + 1) * sizeof(GtkWidget *));
    GdkPixbuf *pixbuf;
    GtkWidget *event_box;

    do {

        if(files_paths[i] != NULL) {
            pixbuf = gdk_pixbuf_new_from_file(files_paths[i], NULL);
            
            path = (char *) malloc(strlen(files_paths[i]) + 1);
            strcpy(path, files_paths[i]);

            event_box = gtk_event_box_new();
            gtk_container_add(GTK_CONTAINER(event_box),
                    gtk_image_new_from_pixbuf(scale_pixbuf(pixbuf, 180, 280)));
            
            gtk_signal_connect(GTK_OBJECT(event_box),
                    "button_press_event",
                    GTK_SIGNAL_FUNC(callback),
                    path); 

            widgets[i] = event_box;
            g_object_unref(G_OBJECT(pixbuf));
        } else {
            widgets[i] = NULL;
        }

    } while(widgets[i++] != NULL);

    return widgets;
}

//возвращает табличку из картинок, расположенных по адресам files_paths
GtkWidget *img_preview_table_new_from_files(char *files_paths[],
        void (*callback)(GtkWidget *, GdkEvent *, gpointer)) {

    const int SPACING = 2;

    GtkWidget *table = new_table(string_vectors_lenght(files_paths));
    GtkWidget **images = new_images_preview_from_files(files_paths, callback);

    gtk_table_set_row_spacings(GTK_TABLE(table), SPACING);
    gtk_table_set_col_spacings(GTK_TABLE(table), SPACING);

    add_widgets(table, images);

    free(images);

    return table;
}

